/*
 *  This sketch sends a message to a TCP server
 *
 */

#include <WiFi.h>
#include <WiFiMulti.h>
#include <ESP32Time.h>
#include <ArduinoJson.h>

// 屏幕驱动
#include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip
#include <SPI.h>
TFT_eSPI tft = TFT_eSPI(128,240);  // Invoke library, pins defined in User_Setup.h
#define TFT_GREY 0x5AEB // New colour


// #define TFT_MISO  3  // Automatically assigned with ESP8266 if not defined
// #define TFT_MOSI  2  // Automatically assigned with ESP8266 if not defined
// #define TFT_SCLK  10  // Automatically assigned with ESP8266 if not defined
// #define TFT_CS    4  // Chip select control pin D8
// #define TFT_DC    6  // Data Command control pin
// #define TFT_RST   7  // Reset pin (could connect to NodeMCU RST, see next line)
// #define TFT_RST  -1     // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// #define TFT_BL 8


//定义黑色
#define BLACK   0x0000


// 呼吸灯 宏定义 GPIO 输出引脚
#define LED_PIN   13 


WiFiMulti WiFiMulti;
float distance1 = 0.0; // 距离1数据

const int TrigPin1 = 2;
const int EchoPin1 = 3;



unsigned long Time_Echo_us1 = 0;
unsigned long Len_mm1 = 0;
unsigned long LastD1 = 0;
unsigned long sec = 0;

WiFiClient client;
StaticJsonDocument<200> json;

ESP32Time rtc(28800);  // offset GMT8

void showText(char text[],int fontSize = 1){
   tft.setCursor(0, 0, 1);//设置TFT屏幕的光标位置和样式。其中，第一个参数是水平位置（x坐标），第二个参数是垂直位置（y坐标），第三个参数是字体大小（2表示大字体）。设置完成后，光标将移动到指定位置，并以指定的字体大小显示文本。
 
  // 函数用于设置文字颜色，第一个参数为文字颜色，第二个参数为背景颜色。
  tft.setTextColor(TFT_WHITE,TFT_BLACK);  
  tft.setTextSize(fontSize);//函数用于设置文字大小，参数为整数，表示文字的大小倍数。
  // We can now plot text on screen using the "print" class
  tft.println(text);
}

void showText1(char text[],int fontSize = 1){
   tft.setCursor(10, 10, 1);//设置TFT屏幕的光标位置和样式。其中，第一个参数是水平位置（x坐标），第二个参数是垂直位置（y坐标），第三个参数是字体大小（2表示大字体）。设置完成后，光标将移动到指定位置，并以指定的字体大小显示文本。
 
  // 函数用于设置文字颜色，第一个参数为文字颜色，第二个参数为背景颜色。
  tft.setTextColor(TFT_YELLOW,TFT_BLACK);  
  tft.setTextSize(fontSize);//函数用于设置文字大小，参数为整数，表示文字的大小倍数。
  tft.println(text);
}

void showText2(char text[],int fontSize = 1){
   tft.setCursor(0, 30, 1);//设置TFT屏幕的光标位置和样式。其中，第一个参数是水平位置（x坐标），第二个参数是垂直位置（y坐标），第三个参数是字体大小（2表示大字体）。设置完成后，光标将移动到指定位置，并以指定的字体大小显示文本。
 
  // 函数用于设置文字颜色，第一个参数为文字颜色，第二个参数为背景颜色。
  tft.setTextColor(TFT_BLUE,TFT_BLACK);  
  tft.setTextSize(fontSize);//函数用于设置文字大小，参数为整数，表示文字的大小倍数。
  tft.println(text);
}

void reShowText(char text[],int fontSize = 1){
   tft.fillScreen(BLACK);//黑色
   delay(10);
   tft.setCursor(0, 0, 1);//设置TFT屏幕的光标位置和样式。其中，第一个参数是水平位置（x坐标），第二个参数是垂直位置（y坐标），第三个参数是字体大小（2表示大字体）。设置完成后，光标将移动到指定位置，并以指定的字体大小显示文本。
 
  // 函数用于设置文字颜色，第一个参数为文字颜色，第二个参数为背景颜色。
  tft.setTextColor(TFT_WHITE,TFT_BLACK);  
  tft.setTextSize(fontSize);//函数用于设置文字大小，参数为整数，表示文字的大小倍数。
  // We can now plot text on screen using the "print" class
  tft.println(text);
}


void setup()
{




  sec++;
  Serial.begin(921600);
  delay(10);
  Serial.println(sec);

  pinMode(EchoPin1, INPUT); // Set EchoPin as input, to receive measure result from US-025,US-026
  pinMode(TrigPin1, OUTPUT);
    // 配置 GPIO 输出引脚
  pinMode(LED_PIN, OUTPUT);
  
  huxi_deng();
  //初始化屏幕
  tft.init();
  tft.setRotation(-4);
  // We start by connecting to a WiFi network

  WiFiMulti.addAP("xiaohe", "23456789");
  WiFiMulti.addAP("wangke", "wxwk1898");
  WiFiMulti.addAP("xiaohe_mobile", "23456789");

  Serial.println();
  Serial.println();
  reShowText("Wait WiFi... ",1);
  Serial.print("Waiting for WiFi... ");


  while (WiFiMulti.run() != WL_CONNECTED)
  {
    Serial.print(".");
   
    delay(2);
    
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  analogWrite(LED_PIN, 10);

  delay(500);
}



void loop()
{
  //初始化屏幕
  // tft.init();
  // tft.setRotation(-4);


  cWifi();

 

  // This will send a request to the server
  // uncomment this line to send an arbitrary string to the server
  // client.print("Send this data to the server");
  // uncomment this line to send a basic document request to the server

  Serial.print("{\"action\":\"door.v1.get\"}");
  client.println("{\"action\":\"door.v1.get\"}");

  int maxloops = 0;

  while (!client.available() && maxloops < 1000)
  {
    maxloops++;
    delay(1); // delay 1 msec
  }
  if (client.available() > 0)
  {
  
    String line = client.readStringUntil('\r');
    Serial.println(line);
    deserializeJson(json, line);
    if(json["success"] == true){
      rtc.setTime(json["time"]);
      Serial.print(rtc.getHour(true)); 
      Serial.print(":"); 
      Serial.print(rtc.getMinute());
      Serial.print(":"); 
      Serial.println(rtc.getSecond());  

      long now_time = json["time"].as<long>();
      long time1 = json["data"]["sex1"]["time"].as<long>();
      long time2 = json["data"]["sex2"]["time"].as<long>();

      Serial.print(String(now_time) +":"+String(time1)+":"+String(time2)); 

      

  //       tft.fillScreen(BLACK);//灰色
  // tft.setCursor(0, 0, 2);//设置TFT屏幕的光标位置和样式。其中，第一个参数是水平位置（x坐标），第二个参数是垂直位置（y坐标），第三个参数是字体大小（2表示大字体）。设置完成后，光标将移动到指定位置，并以指定的字体大小显示文本。
 
  // // 函数用于设置文字颜色，第一个参数为文字颜色，第二个参数为背景颜色。
  // tft.setTextColor(TFT_WHITE,TFT_BLACK);  
  // tft.setTextSize(1);//函数用于设置文字大小，参数为整数，表示文字的大小倍数。
  // // We can now plot text on screen using the "print" class
  // tft.println("Wifi:"+String(WiFi.localIP()));
  
  // // Set the font colour to be yellow with no background, set to font 7
  // tft.setTextColor(TFT_YELLOW); 
  // tft.setTextFont(2);
  // tft.println(123456789);
      tft.fillScreen(BLACK);//黑色
      // 串口打印出json 里面的 data里面的值
      if(time1 > (now_time-15)){
        Serial.println("门1已关闭");
        showText1("man close",1);
      }else{
        Serial.println("门1已打开"+String(time1));
        showText1("man OPEN",2);
      }

      if(time2 > (now_time-15)){
        Serial.println("门2已关闭");
        showText2("woman close",1);
      }else{
        Serial.println("门2已打开"+String(time2));
        showText2("woman OPEN",2);
      }




    }
  }
  else
  {
    showText("client.available() timed out ",1);
    Serial.println("client.available() timed out ");
  }

  Serial.println("Closing connection.");
  client.stop();

  // Serial.println("Waiting 1 seconds before restarting...");
  delay(1000);
}

void huxi_deng(){

  showText("Wait WiFi... ",1);
    // 实现渐亮效果
  for(int i=0;i<200;i++) {
    // 设置亮度模拟值
    analogWrite(LED_PIN, i);
    // 延时 2ms
    delay(5);
    }
  // 实现渐灭效果
  for(int i=200;i>=0;i--) {
    // 设置亮度模拟值
    analogWrite(LED_PIN, i);
    // 延时 2ms
    delay(5);
  }
}

void cWifi()
{

  const uint16_t port = 8082;
  const char *host = "150.158.123.141"; // ip or dns

  // Use WiFiClient class to create TCP connections
  if (!client.connect(host, port))
  {
    Serial.println("Connection failed.");
    Serial.println("Waiting 5 seconds before retrying...");
    delay(5000);

    //判断 wifi 是否断网，如果断网就重连接 WiFi
    if (WiFiMulti.run() != WL_CONNECTED)
    {
      Serial.println("WiFi disconnected.");
      reShowText("Wait WiFi... ",1);
      huxi_deng();

    }
     // 设置亮度模拟值
    analogWrite(LED_PIN, 10);
    return;
  }
  else
  {
    // Serial.print("Connecting to ");
    // Serial.println(host);
  }
}


